From e8156439f24137b5418baad20a7f00f6949cfe29 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 29 May 2007 09:30:34 +0000 Subject: r23183: Check in a change made by Tridge: This replaces the internal explicit dev/ino file id representation by a "struct file_id". This is necessary as cluster file systems and NFS don't necessarily assign the same device number to the shared file system. With this structure in place we can now easily add different schemes to map a file to a unique 64-bit device node. Jeremy, you might note that I did not change the external interface of smb_share_modes.c. Volker (This used to be commit 9b10dbbd5de8813fc15ebbb6be9b18010ffe8139) --- source3/smbd/files.c | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) (limited to 'source3/smbd/files.c') diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 062bebd58e..5ee0696ef9 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -38,8 +38,7 @@ static int files_used; /* A singleton cache to speed up searching by dev/inode. */ static struct fsp_singleton_cache { files_struct *fsp; - SMB_DEV_T dev; - SMB_INO_T inode; + struct file_id id; } fsp_fi_cache; /**************************************************************************** @@ -104,7 +103,7 @@ NTSTATUS file_new(connection_struct *conn, files_struct **result) fsp->fh->fd = -1; fsp->conn = conn; - fsp->fh->file_id = get_gen_count(); + fsp->fh->gen_id = get_gen_count(); GetTimeOfDay(&fsp->open_time); first_file = (i+1) % real_max_open_files; @@ -233,9 +232,9 @@ void file_dump_open_table(void) files_struct *fsp; for (fsp=Files;fsp;fsp=fsp->next,count++) { - DEBUG(10,("Files[%d], fnum = %d, name %s, fd = %d, fileid = %lu, dev = %x, inode = %.0f\n", - count, fsp->fnum, fsp->fsp_name, fsp->fh->fd, (unsigned long)fsp->fh->file_id, - (unsigned int)fsp->dev, (double)fsp->inode )); + DEBUG(10,("Files[%d], fnum = %d, name %s, fd = %d, gen = %lu, fileid=%s\n", + count, fsp->fnum, fsp->fsp_name, fsp->fh->fd, (unsigned long)fsp->fh->gen_id, + file_id_static_string(&fsp->file_id))); } } @@ -264,16 +263,15 @@ files_struct *file_find_fd(int fd) Find a fsp given a device, inode and file_id. ****************************************************************************/ -files_struct *file_find_dif(SMB_DEV_T dev, SMB_INO_T inode, unsigned long file_id) +files_struct *file_find_dif(struct file_id id, unsigned long gen_id) { int count=0; files_struct *fsp; for (fsp=Files;fsp;fsp=fsp->next,count++) { /* We can have a fsp->fh->fd == -1 here as it could be a stat open. */ - if (fsp->dev == dev && - fsp->inode == inode && - fsp->fh->file_id == file_id ) { + if (file_id_equal(&fsp->file_id, &id) && + fsp->fh->gen_id == gen_id ) { if (count > 10) { DLIST_PROMOTE(Files, fsp); } @@ -281,10 +279,11 @@ files_struct *file_find_dif(SMB_DEV_T dev, SMB_INO_T inode, unsigned long file_i if ((fsp->fh->fd == -1) && (fsp->oplock_type != NO_OPLOCK) && (fsp->oplock_type != FAKE_LEVEL_II_OPLOCK)) { - DEBUG(0,("file_find_dif: file %s dev = %x, inode = %.0f, file_id = %u \ -oplock_type = %u is a stat open with oplock type !\n", fsp->fsp_name, (unsigned int)fsp->dev, - (double)fsp->inode, (unsigned int)fsp->fh->file_id, - (unsigned int)fsp->oplock_type )); + DEBUG(0,("file_find_dif: file %s file_id = %s, gen = %u \ +oplock_type = %u is a stat open with oplock type !\n", fsp->fsp_name, + file_id_static_string(&fsp->file_id), + (unsigned int)fsp->fh->gen_id, + (unsigned int)fsp->oplock_type )); smb_panic("file_find_dif\n"); } return fsp; @@ -316,22 +315,20 @@ files_struct *file_find_fsp(files_struct *orig_fsp) calls. ****************************************************************************/ -files_struct *file_find_di_first(SMB_DEV_T dev, SMB_INO_T inode) +files_struct *file_find_di_first(struct file_id id) { files_struct *fsp; - if (fsp_fi_cache.dev == dev && fsp_fi_cache.inode == inode) { + if (file_id_equal(&fsp_fi_cache.id, &id)) { /* Positive or negative cache hit. */ return fsp_fi_cache.fsp; } - fsp_fi_cache.dev = dev; - fsp_fi_cache.inode = inode; + fsp_fi_cache.id = id; for (fsp=Files;fsp;fsp=fsp->next) { if ( fsp->fh->fd != -1 && - fsp->dev == dev && - fsp->inode == inode ) { + file_id_equal(&fsp->file_id, &id)) { /* Setup positive cache. */ fsp_fi_cache.fsp = fsp; return fsp; @@ -353,9 +350,9 @@ files_struct *file_find_di_next(files_struct *start_fsp) for (fsp = start_fsp->next;fsp;fsp=fsp->next) { if ( fsp->fh->fd != -1 && - fsp->dev == start_fsp->dev && - fsp->inode == start_fsp->inode ) + file_id_equal(&fsp->file_id, &start_fsp->file_id)) { return fsp; + } } return NULL; @@ -392,9 +389,7 @@ void fsp_set_pending_modtime(files_struct *tfsp, const struct timespec mod) } for (fsp = Files;fsp;fsp=fsp->next) { - if ( fsp->fh->fd != -1 && - fsp->dev == tfsp->dev && - fsp->inode == tfsp->inode ) { + if ( fsp->fh->fd != -1 && file_id_equal(&fsp->file_id, &tfsp->file_id)) { fsp->pending_modtime = mod; fsp->pending_modtime_owner = False; } @@ -542,8 +537,7 @@ NTSTATUS dup_file_fsp(files_struct *fsp, dup_fsp->fh = fsp->fh; dup_fsp->fh->ref_count++; - dup_fsp->dev = fsp->dev; - dup_fsp->inode = fsp->inode; + dup_fsp->file_id = fsp->file_id; dup_fsp->initial_allocation_size = fsp->initial_allocation_size; dup_fsp->mode = fsp->mode; dup_fsp->file_pid = fsp->file_pid; -- cgit