{
int xid;
int rc = -EINVAL;
+ int oplock = FALSE;
struct cifs_sb_info *cifs_sb;
struct cifsTconInfo *pTcon;
char *full_path = NULL;
+ __u32 filter = FILE_NOTIFY_CHANGE_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES;
+ __u16 netfid;
xid = GetXid();
cifs_sb = CIFS_SB(file->f_dentry->d_sb);
pTcon = cifs_sb->tcon;
+
+ down(&file->f_dentry->d_sb->s_vfs_rename_sem);
full_path = build_path_from_dentry(file->f_dentry);
- cFYI(1,("cifs dir notify on file %s",full_path));
- /* CIFSSMBNotify */
+ up(&file->f_dentry->d_sb->s_vfs_rename_sem);
+
+ if(full_path == NULL) {
+ rc = -ENOMEM;
+ } else {
+ cFYI(1,("cifs dir notify on file %s",full_path));
+ rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN,
+ GENERIC_READ | SYNCHRONIZE, 0 /* create options */,
+ &netfid, &oplock,NULL, cifs_sb->local_nls);
+ /* BB fixme - add this handle to a notify handle list */
+ if(rc) {
+ cFYI(1,("Could not open directory for notify"));
+ } else {
+ rc = CIFSSMBNotify(xid, pTcon, 1 /* subdirs */, netfid,
+ filter, cifs_sb->local_nls);
+ /* BB add code to close file eventually (at unmount
+ it would close automatically but may be a way
+ to do it easily when inode freed or when
+ notify info is cleared/changed */
+ }
+ }
+
FreeXid(xid);
return rc;
}